home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 33
/
Aminet 33 - October 1999.iso
/
Tools
/
ClassAct
/
Examples
/
String
/
stringexample.c
< prev
next >
Wrap
C/C++ Source or Header
|
1997-04-27
|
7KB
|
319 lines
;/* String Example
sc link stringexample.c lib lib:classact.lib
quit
*/
/**
** StringExample.c -- String class Example.
**
** This is a simple example testing some of the capabilities of the
** String gadget class.
**
** This code opens a window and then creates 2 String gadgets which
** are subsequently attached to the window's gadget list. One uses
** and edit hook, and the other does not. Notice that you can tab
** cycle between them.
**/
/* system includes
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <exec/types.h>
#include <exec/memory.h>
#include <intuition/intuition.h>
#include <intuition/gadgetclass.h>
#include <intuition/sghooks.h> /* required for string hooks */
#include <graphics/gfxbase.h>
#include <graphics/text.h>
#include <graphics/gfxmacros.h>
#include <utility/tagitem.h>
#include <workbench/startup.h>
#include <workbench/workbench.h>
#include <proto/intuition.h>
#include <proto/graphics.h>
#include <proto/exec.h>
#include <proto/dos.h>
#include <proto/utility.h>
#include <proto/wb.h>
#include <proto/icon.h>
/* ClassAct includes
*/
#include <classact.h>
enum
{
GID_MAIN=0,
GID_STRING1,
GID_STRING2,
GID_DOWN,
GID_UP,
GID_QUIT,
GID_LAST
};
enum
{
WID_MAIN=0,
WID_LAST
};
enum
{
OID_MAIN=0,
OID_LAST
};
/* hook function typedef
*/
typedef ULONG (*HookFunction)(VOID);
/* hook function prototype
*/
ULONG __saveds __asm PasswordHook(
register __a0 struct Hook *hook,
register __a2 struct SGWork *sgw,
register __a1 ULONG *msg);
#define SMAX 24
#define PASSWORDCHAR '*'
UBYTE initialstring[] = "Testing";
int main(void)
{
struct MsgPort *AppPort;
struct Window *windows[WID_LAST];
struct Gadget *gadgets[GID_LAST];
Object *objects[OID_LAST];
/* make sure our classes opened... */
if (!ButtonBase || !StringBase || !WindowBase || !LayoutBase)
return(30);
else if ( AppPort = CreateMsgPort() )
{
struct Hook edithook1;
STRPTR hookdata1;
/* The password edit hook needs special care, we need to look at
* edithook.h_Data to set/get the real password text. Additionally,
* we need to Alloc/Free maxchars bytes for its buffer!
*/
hookdata1 = (STRPTR)AllocVec( (SMAX + 2), MEMF_ANY | MEMF_CLEAR);
if (hookdata1)
{
CA_SetUpHook(edithook1, PasswordHook, (STRPTR)hookdata1);
/* copy real string data into the hidden buffer */
strcpy(hookdata1, (STRPTR)initialstring);
/* re-initialize real/visible string with password chars */
memset((void *)initialstring, PASSWORDCHAR, strlen((STRPTR)initialstring));
/* Create the window object.
*/
objects[OID_MAIN] = WindowObject,
WA_ScreenTitle, "ClassAct Release 2.0",
WA_Title, "ClassAct String Example",
WA_Activate, TRUE,
WA_DepthGadget, TRUE,
WA_DragBar, TRUE,
WA_CloseGadget, TRUE,
WA_SizeGadget, TRUE,
WINDOW_IconifyGadget, TRUE,
WINDOW_IconTitle, "String",
WINDOW_AppPort, AppPort,
WINDOW_Position, WPOS_CENTERMOUSE,
WINDOW_ParentGroup, gadgets[GID_MAIN] = VGroupObject,
LAYOUT_SpaceOuter, TRUE,
LAYOUT_DeferLayout, TRUE,
LAYOUT_AddChild, gadgets[GID_STRING1] = StringObject,
GA_ID, GID_STRING1,
GA_RelVerify, TRUE,
GA_TabCycle, TRUE,
STRINGA_MinVisible, 10,
STRINGA_MaxChars, SMAX,
StringEnd,
CHILD_NominalSize, TRUE,
CHILD_Label, LabelObject, LABEL_Text, "String _1", LabelEnd,
LAYOUT_AddChild, gadgets[GID_STRING2] = StringObject,
GA_ID, GID_STRING2,
GA_RelVerify, TRUE,
GA_TabCycle, TRUE,
STRINGA_MinVisible, 10,
STRINGA_MaxChars, SMAX,
STRINGA_EditHook, &edithook1,
STRINGA_TextVal, initialstring,
StringEnd,
CHILD_Label, LabelObject, LABEL_Text, "String _2", LabelEnd,
LAYOUT_AddChild, ButtonObject,
GA_ID, GID_QUIT,
GA_RelVerify, TRUE,
GA_Text,"_Quit",
ButtonEnd,
CHILD_WeightedHeight, 0,
EndGroup,
EndWindow;
/* Object creation sucessful?
*/
if (objects[OID_MAIN])
{
/* Open the window.
*/
if (windows[WID_MAIN] = (struct Window *) CA_OpenWindow(objects[OID_MAIN]))
{
ULONG wait, signal, app = (1L << AppPort->mp_SigBit);
ULONG done = FALSE;
ULONG result;
UWORD code;
/* Obtain the window wait signal mask.
*/
GetAttr(WINDOW_SigMask, objects[OID_MAIN], &signal);
/* Activate the first string gadget!
*/
ActivateLayoutGadget( gadgets[GID_MAIN], windows[WID_MAIN], NULL, gadgets[GID_STRING1] );
/* Input Event Loop
*/
while (!done)
{
wait = Wait( signal | SIGBREAKF_CTRL_C | app );
if ( wait & SIGBREAKF_CTRL_C )
{
done = TRUE;
}
else
{
while ( (result = CA_HandleInput(objects[OID_MAIN], &code) ) != WMHI_LASTMSG )
{
switch (result & WMHI_CLASSMASK)
{
case WMHI_CLOSEWINDOW:
windows[WID_MAIN] = NULL;
done = TRUE;
break;
case WMHI_GADGETUP:
switch (result & WMHI_GADGETMASK)
{
case GID_STRING1:
printf( "Contents: %s\n", ((struct StringInfo *)(gadgets[GID_STRING1]->SpecialInfo))->Buffer);
break;
case GID_STRING2:
printf( "Contents: %s\n", hookdata1 );
break;
case GID_QUIT:
done = TRUE;
break;
}
break;
case WMHI_ICONIFY:
CA_Iconify(objects[OID_MAIN]);
windows[WID_MAIN] = NULL;
break;
case WMHI_UNICONIFY:
windows[WID_MAIN] = (struct Window *) CA_OpenWindow(objects[OID_MAIN]);
if (windows[WID_MAIN])
{
GetAttr(WINDOW_SigMask, objects[OID_MAIN], &signal);
}
else
{
done = TRUE; // error re-opening window!
}
break;
}
}
}
}
}
/* Disposing of the window object will also close the window if it is
* already opened, and it will dispose of the layout object attached to it.
*/
DisposeObject(objects[OID_MAIN]);
}
/* free the password hook buffer
*/
FreeVec(hookdata1);
}
DeleteMsgPort(AppPort);
}
return(0);
}
/** Password Entry Hook
**/
ULONG __saveds __asm PasswordHook(register __a0 struct Hook *hook, register __a2 struct SGWork *sgw, register __a1 ULONG *msg)
{
STRPTR pass_ptr = (STRPTR)hook->h_Data;
sgw->BufferPos = sgw->NumChars;
if(*msg == SGH_KEY)
{
switch (sgw->EditOp)
{
case EO_INSERTCHAR:
if(pass_ptr)
{
pass_ptr[sgw->BufferPos - 1] = sgw->WorkBuffer[sgw->BufferPos - 1];
pass_ptr[sgw->BufferPos] = '\0';
}
sgw->WorkBuffer[sgw->BufferPos - 1] = (UBYTE)PASSWORDCHAR;
break;
case EO_DELBACKWARD:
if(pass_ptr)
{
pass_ptr[sgw->BufferPos] = '\0';
}
break;
default:
sgw->Actions &= ~SGA_USE;
break;
}
sgw->Actions |= SGA_REDISPLAY;
return (~0L);
}
if(*msg == SGH_CLICK)
{
sgw->BufferPos = sgw->NumChars;
return (~0L);
}
return(0L);
}